#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h> // 用于 inet_pton

#define LINE_LEN 512

// 将16进制的地址转换为点分十进制格式的IP地址
void hex_to_ip(const char *hex, char *ip) {
    unsigned int a, b, c, d;
    sscanf(hex, "%2x%2x%2x%2x", &a, &b, &c, &d);
    sprintf(ip, "%u.%u.%u.%u", a, b, c, d);
}

// 将端口号从16进制转换为10进制
int hex_to_port(const char *hex) {
    int port;
    sscanf(hex, "%4x", &port);
    return port;
}

int main(int argc, char* argv[]) {
    FILE *fp = fopen("/proc/net/tcp", "r");
    if (!fp) {
        perror("open /proc/net/tcp");
        return 1;
    }

    char line[LINE_LEN];
    // 读表头
    if (!fgets(line, sizeof(line), fp)) {
        fclose(fp);
        return 1;
    }

    // 打印你需要的表头
    printf("%-4s %-23s %-23s %-3s %-10s %-10s\n", "sl", "local_address", "rem_address", "st", "tx_queue", "rx_queue");

    // 逐行读取数据
    while (fgets(line, sizeof(line), fp)) {
        int sl;
        char local_addr[24], rem_addr[24], st[3];
        char tx_rx_queue[32], *txq, *rxq;
        char local_ip[16], rem_ip[16];
        int local_port, rem_port;

        // 只解析前面几个字段
        if (sscanf(line, " %d: %23s %23s %2s %31s", &sl, local_addr, rem_addr, st, tx_rx_queue) < 5) {
            continue;
        }

        // 只保留 01（ESTABLISHED）和 02（SYN_SENT）
        if (strcmp(st, "01") != 0 && strcmp(st, "02") != 0) {
            continue;
        }

        // 将 IP 地址从 hex 转换为点分十进制
        hex_to_ip(local_addr, local_ip);
        hex_to_ip(rem_addr, rem_ip);

        // 提取端口号并转换为十进制
        local_port = hex_to_port(local_addr + 8); // 端口位于后 4 字符
        rem_port = hex_to_port(rem_addr + 8);

        // 将 tx_queue 和 rx_queue 转换为十进制
        txq = strtok(tx_rx_queue, ":");
        rxq = strtok(NULL, ":");
        int tx_queue = strtol(txq, NULL, 16);
        int rx_queue = strtol(rxq, NULL, 16);

        // 打印转换后的数据
        printf("%-4d %-15s:%-5d %-15s:%-5d %-3s %-10d %-10d\n", sl, local_ip, local_port, rem_ip, rem_port, st, tx_queue, rx_queue);
    }

    fclose(fp);
    return 0;
}

// tcp6版本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LINE_LEN 256

// 函数：将十六进制的地址转换为 IPv6 格式的点分十进制地址
void hex_to_ip6(const char *hex, char *ip) {
    unsigned int a, b, c, d, e, f, g, h;
    sscanf(hex, "%4x%4x%4x%4x%4x%4x%4x%4x", &a, &b, &c, &d, &e, &f, &g, &h);
    sprintf(ip, "%x:%x:%x:%x:%x:%x:%x:%x", a, b, c, d, e, f, g, h);
}

// 函数：将十六进制端口转换为十进制端口
int hex_to_port(const char *hex) {
    unsigned int port;
    sscanf(hex, "%4x", &port);
    return port;
}

int main() {
    FILE *fp = fopen("/proc/net/tcp6", "r");
    if (!fp) {
        perror("open /proc/net/tcp6");
        return 1;
    }

    char line[LINE_LEN];
    // 读表头
    if (!fgets(line, sizeof(line), fp)) {
        fclose(fp);
        return 1;
    }

    // 打印你需要的表头
    printf("%-4s %-39s %-39s %-3s %-10s %-10s\n", "sl", "local_address", "rem_address", "st", "tx_queue", "rx_queue");

    // 逐行读取数据
    while (fgets(line, sizeof(line), fp)) {
        int sl;
        char local_addr[40], rem_addr[40], st[3];
        char tx_rx_queue[32], *txq, *rxq;
        char local_ip[40], rem_ip[40];
        int local_port, rem_port;

        // 只解析前面几个字段
        if (sscanf(line, " %d: %39s %39s %2s %31s", &sl, local_addr, rem_addr, st, tx_rx_queue) < 5) {
            continue;
        }

        // 只保留 01（ESTABLISHED）和 02（SYN_SENT）
        if (strcmp(st, "01") != 0 && strcmp(st, "02") != 0) {
            continue;
        }

        // 将 IPv6 地址从 hex 转换为点分十进制
        hex_to_ip6(local_addr, local_ip);
        hex_to_ip6(rem_addr, rem_ip);

        // 提取端口号并转换为十进制
        local_port = hex_to_port(local_addr + 24); // 端口位于后 4 字符
        rem_port = hex_to_port(rem_addr + 24);

        // 将 tx_queue 和 rx_queue 转换为十进制
        txq = strtok(tx_rx_queue, ":");
        rxq = strtok(NULL, ":");
        int tx_queue = strtol(txq, NULL, 16);
        int rx_queue = strtol(rxq, NULL, 16);

        // 打印转换后的数据
        printf("%-4d %-39s %-39s %-3s %-10d %-10d\n", sl, local_ip, local_port, rem_ip, rem_port, st, tx_qu_



#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>

void timer_handler(int signum) {
    printf("Timer triggered!\n");
}

void stop_timer() {
    struct itimerval timer;
    timer.it_value.tv_sec = 0;  // 0 秒后停止定时器
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 0;  // 停止定时器
    timer.it_interval.tv_usec = 0;

    // 停止定时器
    setitimer(ITIMER_REAL, &timer, NULL);
    printf("Timer stopped.\n");
}

int main() {
    // 设置定时器
    struct itimerval timer;
    timer.it_value.tv_sec = 5;  // 第一次触发延迟 5 秒
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 5;  // 每隔 5 秒触发一次
    timer.it_interval.tv_usec = 0;

    // 启动定时器
    setitimer(ITIMER_REAL, &timer, NULL);
    signal(SIGALRM, timer_handler);  // 设置信号处理器

    // 模拟运行一段时间，然后停止定时器
    sleep(10);  // 等待 10 秒，定时器触发两次
    stop_timer();  // 停止定时器

    return 0;
}

